//var log = air.Introspector.Console.log;

var SimpleArray = function(items)
	{
		var length = 0;
		var _items = {};
		var add = function(key, value)
			{
				if(typeof _items[key] == 'undefined')
				{
					_items[key] = value;
					length++;
					return true;
				}
				return false;
			};
		
		if(typeof items != 'undefined')
		{
			for(key in items) 
			{
				if(typeof items[key] == 'object')
				{
					add(key, items[key]);
				}
			}
		}
		
		this.add = add;
		this.del = function(key)
			{
				if(typeof _items[key] != 'undefined')
				{
					delete _items[key];
					length--;
					return true;
				}
				return false;
			};
		this.getCount = function()
			{
				return length;
			}
		this.getItems = function()
			{
				return _items;
			}
		this.getRows = function()
			{
				var rows = [];
				for(var index in _items)
				{
					rows[rows.length] = _items[index];
				}
				return rows;
			}
	};
			
Ext.state.Manager.setProvider(new Ext.air.FileProvider
	({
		file: 'contatos_conectas_air', //or whatever
		defaultState: 
			{
				applicationWindow: 
					{
						width: 600, //the default size for the window
						height: 420
					},
				mainWindow: 
					{
						width: 10240, //an arbitrary number, larger than the width of a very large screen
						height: 10240,
						x: 0, //the default placement for the window
						y: 0
					},
				loginHistory: {}
			}
	}));
var resultTpl = new Ext.XTemplate('<tpl for="."><div class="x-combo-list-item">', '{nome}', '</div></tpl>');
var application;

Ext.onReady(function()
	{
		Ext.BLANK_IMAGE_URL = 'ext-2.2.1/resources/images/default/s.gif';
		Ext.QuickTips.init();
		
		var msgBoxWin = Ext.MessageBox.getDialog();
		msgBoxWin.on('show', function()
			{
				var size = application.getSize();
				
				this.mask.setSize(size.width, size.height);
				this.setPosition(this.x, 30);
				this.dd.lock();
			});
		
		application = new Ext.air.Window
			({
				minimizeToTray: 'true',
				trayIcon: 'checkbox',
				width: 590,
				height: 160,
				title: 'Contatos - Conectas',
				layout: 'fit',
				items:
					[
						new Ext.form.FormPanel
					    	({
						        dontEncodePwd: false,
								url: 'http://youdomain/gc/usuarios/login_air/',
						        method: 'post',
						        
						        title: 'Login',
						        frame: true,
								monitorResize: false,
						        
						        bodyStyle: 'padding: 5px',
						        labelWidth: 75,
						        
						        defaults:
						        	{
										blankText: 'Este campo é obrigatório',
						        	 	maxLengthText: 'Limite do campo: {0} caracteres',
										maxLength: 255,
										width: '95%',
										allowBlank: false,
										disabled: true
									},
						        items:
									[
										new Ext.form.TextField
								            ({
								                fieldLabel: 'Login',
								                name: 'data[Usuario][login]'
							           		}),
										new Ext.form.TextField
								            ({
								                fieldLabel: 'Senha',
								                name: 'data[Usuario][senha]',
												autoCreate:	{tag: 'input', type: 'password'}
								            }),
										new Ext.form.Hidden
											({
												name: 'data[Usuario][senha]'
											}),
										new Ext.form.Hidden
											({
												name: 'data[Usuario][tries]',
												value: 0
											})
									],
						        buttons:
							        [
								        {
								            text: 'Login',
								            handler: function()
									            {
													this.doSubmit();
												}
								        }
							        ],
								doSubmit: function()
							        {
										this.dialog.wait('Aguarde', 'Processando ...', Ext.Ajax.abort);
										this.form.submit
											({
												success: function(form, action)
													{
														var response = Ext.util.JSON.decode(action.response.responseText); 
														var application = form._parent._parent;
														//alert(action.response.responseText); return false;
														
														if(typeof response.hash == 'undefined' && response.success === 'true')
														{
															if(form.dialog.login) form.dialog.login.hide();
															Ext.MessageBox.wait('Aguarde', 'Processando ...');
															
															var now = new Date();
															var loginHistory = new SimpleArray(Ext.state.Manager.get('loginHistory'));
															var login = form._parent.items.get(0).getValue();
															var senha = hex_sha1(form._parent.items.get(1).getValue());
															
															loginHistory.add(hex_sha1(login),														 
																{
																	date: now.format('Y-m-d H:i:s'),
																	nome: login,
																	senha: senha
																});
															Ext.state.Manager.set('loginHistory', loginHistory.getItems());
															
															application.removeAll(true);
															
															var ajuda = new Ext.Window
																({
																	autoCreate: true,
												                    title: 'Ajuda',
																	bodyStyle: 'padding: 5px',
												                    resizable: false,
												                    constrain: true,
												                    constrainHeader: true,
												                    minimizable: false,
												                    maximizable: false,
												                    stateful: false,
												                    modal: true,
												                    shim: true,
												                    width:400,
												                    minHeight: 80,
												                    plain: true,
												                    footer: true,
												                    closable: false,
																	html: '<p>Bem vindo ao sistema de gerenciamento de contatos da Conectas. Você esta acessando a parte do sistema referente a consulta de contatos. Caso deseje administrar algum contato, você deverá acessar a parte administrativa do sistema. Para isso, clique <a class="ajuda" href="http://youdomain/gc/admin/" target="_blank">aqui</a>.</p><p>Para buscar um contato, basta digitar as informações referentes ao mesmo no campo de texto e o sistema apresentará possíveis sugestões. Para visualizar as informações do contato desejado, clique no nome da lista apresentada pelo sistema.</p><p class="text_and_image">Para sair fechar o aplicativo, basta clicar no botão <span class="close"></span> na barra horizontal superior. Caso deseje mumiza-lo, clique no botão <span class="minimize"></span> e o programa sera minimizado para área de notificações (tray) do seu sistema operacional. Para restaura-lo, clique no ícone <span class="icon"></span> na barra de notificações.</p><p>Caso deseje acessar este mesmo aplicativo através do navegador do seu computador, clique <a class="ajuda" href="http://youdomain/gc" target="_blank">aqui</a>.</p>',
																	listeners:
																		{
																			'render': function(_self)
																				{
																					this.addTool
																						({
																							id: 'close',
																							handler: function()
																								{
																									_self.hide(application.getTool('help'));
																								}
																						});
																				},
																			'show':
																				{
																					fn: function()
																						{
																							var size = application.getSize();
						
																							this.mask.setSize(size.width, size.height);
																							this.setPosition(this.x, 30);
																							this.dd.lock();
																							
																							Ext.each(Ext.query('a.ajuda'),function()
																								{
																									var element = new Ext.Element(this);
																									var request = new air.URLRequest(this.href);

																									element.set
																										({
																											href: 'javascript:;'
																										});
																									
																									element.on('click', function()
																										{
																											air.navigateToURL(request);
																										});
																								});
																						},
																					single: true
																				}
																		}
																});
															
															application.addTool
																({
																	id: 'help',
																	handler: function()
																		{
																			ajuda.show(application.getTool('help'));
																		}
																});															
															
															application.add
																(
																	new Ext.form.ComboBox
																		({
																			fieldLabel: 'Busca',
																			labelStyle: 'font-weight:bold;',
																			width: 575,
																			minChars: 1,
																			queryParam: 'termo',
																			valueField: 'id',
																			displayField: 'nome',
																			loadingText: 'Pesquisando ...',
																			pageSize: 10,
																			tpl: resultTpl,
																			hideTrigger: true,
																			pageSize: 0,
																			listeners: 
																				{
																					'select': function(combo, record, index)
																						{
																							Ext.MessageBox.wait('Carregando', 'Aguarde ...');
																							var informacoes = application.items.get(1);
											
																							Ext.Ajax.request
																								({
																									url: 'http://youdomain/gc/contatos/index/' + record.get('id') + '/',
																									success: function(response, options)
																									{
																										Ext.MessageBox.hide();
																										var response = Ext.util.JSON.decode(response.responseText);
																										
																										if (response.success === 'true') 
																										{
																											informacoes.el.stopFx();
																											application.el.disableShadow();
																											informacoes.el.slideOut('t', 
																												{
																													callback: function()
																														{
																															informacoes.el.dom.innerHTML = response.contato;
																															informacoes.el.stopFx();
																															informacoes.el.slideIn('t',
																																{
																																	callback: function()
																																		{
																																			Ext.each(Ext.query('a[href="copy"]'), function()
																																				{
																																					new Ext.Element(this).on('click', function()
																																						{
																																							Ext.air.Clipboard.setData(air.ClipboardFormats.TEXT_FORMAT, this.getAttributeNS('', 'innerHTML'));
																																						});
																																				});
																																			Ext.each(Ext.query('a[href="mail"]'), function()
																																				{
																																					new Ext.Element(this).on('click', function()
																																						{
																																				            var request = new air.URLRequest('mailto:' + this.getAttributeNS('', 'innerHTML'));
																																							air.navigateToURL(request);
																																						});
																																				});
																																			Ext.each(Ext.query('a[href="gmap"]'), function()
																																				{
																																					new Ext.Element(this).on('click', function()
																																						{
																																							var url = 'http://maps.google.com/?q=' + this.getAttributeNS('', 'innerHTML').replace(/\(.+\)/gi, '');
																																				            var request = new air.URLRequest(url);
																																							
																																							air.navigateToURL(request);
																																						});
																																				});
																																				
																																			application.el.enableShadow(true);			
																																		}
																																});
																														}
																												});
																										}
																										else 
																										{
																											Ext.MessageBox.alert('Erro', response.erro);
																										}
																									},
																									failure: function(action)
																										{
																											Ext.MessageBox.alert('Erro', 'Não foi possivel conectar-se com o servidor, por favor tente novamente');
																										}
																								});
																							
																						}
																				},
																			store: new Ext.data.JsonStore
																				({
																					url: 'http://youdomain/gc/busca',
																					id: 'id',
																					root: 'rows',
																					totalProperty: 'total',
																					fields: ['id', 'nome']
																				})
																		}),
																	new Ext.Panel
																		({
																			id: 'result',
																			html: '<div />'
																		})
																);
															application.on('afterlayout', Ext.MessageBox.hide, null, {single: true});
															application.setHeight('auto');
															application.doLayout();
														}
														else
														{
															Ext.MessageBox.alert('Erro', response.erro);
															
															if(response.block === 'true')
															{
																return form._parent.blockApp.apply(form._parent);
															}
														}
														
														form.unlockField();
													},
												failure: function(form, action)
													{
														Ext.MessageBox.alert('Erro', 'Não foi possivel conectar-se com o servidor, por favor tente novamente');
														form.unlockField();
													}
											});
							        },
								unlockField: function()
									{
										var senha = this.items.get(1);
												
										senha.setValue('');
										senha.setDisabled(false);
									},
								blockApp: function()
									{
										this.form.reset();
										this.dialog.login.disable();
										this.dialog.login.close();
										this.disable();
										
										return false;
									},
								getHash: function()
									{
										var _self = this;
										 
										Ext.Ajax.request
											({
												url: '',
												success: function(response, options)
													{
														Ext.MessageBox.hide();
														var response = Ext.util.JSON.decode(response.responseText);
														
														if(response.success === 'true') 
														{
															_self.hash = response.hash;
															_self.items.each(function(item)
																{
																	item.setDisabled(false);
																});
															
															_self.processLoginHistory.apply(_self, [_self]);
														}
													},
												failure: function(action)
													{
														_self.dialog.erro('Erro', 'Não foi possivel conectar-se com o servidor. Deseja tentar novamente?', _self.dialog.config, _self);
													}
											});
									},
								dialog: 
									{
										config: function()
											{
												var window = Ext.MessageBox.getDialog();
												
												window.on('show', this.getHash,
													this,
													{
														single: true
													});
												
												Ext.MessageBox.show
													({
														title: 'Aguarde',
														msg: 'Configurando a aplicação ...',
														icon: Ext.MessageBox.WAIT,
														closable: false
													});
											},
										erro: function(title, msg, fn, scope)
											{
												Ext.MessageBox.show
													({
														title: title,
														msg: msg,
														buttons: Ext.Msg.YESNO,
														fn: function(option)
															{
																if(option == 'yes')
																{
																	fn.apply(scope);
																}
																else
																{
																	scope._parent.close();
																}
															},
														icon: Ext.MessageBox.WAIT,
														closable: false
													});
											},
										wait: function(title, msg, fn)
											{
												return Ext.MessageBox.show
													({
														title: title,
														msg: msg,
														buttons: Ext.Msg.CANCEL,
														fn: fn,
														icon: Ext.MessageBox.WAIT
													});
											}
									},
								processLoginHistory: function(form)
									{
										var loginHistory = new SimpleArray(Ext.state.Manager.get('loginHistory'));
										
										if(loginHistory.getCount() > 0) 
										{
											var items = loginHistory.getItems();
											var recentLoginHistory = new SimpleArray();
											var now = new Date();
											var past = new Date();
											past.setDate(past.getDate() - 5);
											
											for(var encodedLogin in items) 
											{
												var login = items[encodedLogin];
												var loginDate = Date.parseDate(login.date, 'Y-m-d H:i:s');
												
												if(loginDate.between(past, now)) 
												{
													recentLoginHistory.add(encodedLogin, login);
												}
											}
											
											Ext.state.Manager.set('loginHistory', recentLoginHistory.getItems());
											
											if(recentLoginHistory.getCount() > 0) 
											{
												var rows = recentLoginHistory.getRows();
												var doAutologin = function(_self, record, index)
													{
														form.dontEncodePwd = true;
														form.items.get(0).setValue(record.get('nome'));
														form.items.get(1).setValue(record.get('senha'));
														form.items.get(2).setValue(record.get('senha'));
														
														form.doSubmit();
													};
												
												if (recentLoginHistory.getCount() == 1) 
												{
													var window = Ext.MessageBox.getDialog();
													var msg = 'Realizando login como <i><b>'+rows[0]['nome']+'</b></i> em 8 segundos: {0}';
													
													var seconds = 1;
													var interval = setInterval(function()
														{
															if(seconds > 8) 
															{
																clearInterval(interval);
																Ext.MessageBox.hide();
																doAutologin(null, new Ext.data.Record(rows[0]));
															}
															else 
															{
																Ext.MessageBox.updateText(String.format(msg, seconds++));
																window.fireEvent('show');
															}
														},
														1000);
													
													Ext.MessageBox.show
														({
															title: 'Auto-login',
															msg: String.format(msg, seconds++),
															buttons: Ext.Msg.CANCEL,
															fn: function()
																{
																	clearInterval(interval);
																},
															icon: Ext.MessageBox.WAIT,
															closable: false
														});
												}
												else 
												{
												
													this.dialog.login = new Ext.Window(
														{
															autoCreate: true,
															title: 'Histórico de logins',
															resizable: false,
															constrain: true,
															minimizable: false,
															maximizable: false,
															stateful: false,
															modal: true,
															width: 300,
															minHeight: 80,
															items: [new Ext.form.FormPanel(
																{
																	frame: true,
																	defaults: 
																		{
																			hideLabel: true
																		},
																	
																	items: [new Ext.form.ComboBox(
																		{
																			width: 272,
																			valueField: 'senha',
																			displayField: 'nome',
																			tpl: resultTpl,
																			mode: 'local',
																			readOnly: true,
																			store: new Ext.data.JsonStore(
																				{
																					id: 'senha',
																					root: 'rows',
																					fields: ['senha', 'nome'],
																					data: 
																						{
																							rows: rows
																						}
																				}),
																			listeners: 
																				{
																					'select': doAutologin
																				}
																		}), new Ext.form.Label(
																		{
																			html: 'Lista dos logins realizados nos últimos 5 dias. Escolha um dos items acima para realizar o login automaticamente.'
																		})]
																})],
															listeners: 
																{
																	'show': function()
																	{
																		var size = application.getSize();
																		
																		this.mask.setSize(size.width, size.height);
																		this.setPosition(this.x, 30);
																		this.dd.lock();
																	}
																}
														});
													this.dialog.login.show();
												}
											}
										}
									},
								listeners:
									{
										'render': function(_self)
											{
												this.form._parent = this;
												this.keys =
													{
													    key: Ext.EventObject.ENTER,
													    fn: function()
															{
																_self.buttons[0].handler.apply(_self);
															}
													};
													
												for(var index in this.buttons)
												{
													this.buttons[index].scope = this;
												}
												
												new Ext.util.DelayedTask(this.dialog.config, this).delay(500);
											},
										'beforeaction': function()
											{
												if (typeof this.hash == 'undefined') 
												{
													this.getHash();
												}
												else
												{
													if(this.form.isValid()) 
													{
														var fields = this.items;
														var tries = parseInt(fields.get(3).getValue());
														
														if(tries > 2)
														{
															Ext.MessageBox.hide();
															this.blockApp();
														}
														else
														{
															var senha = fields.get(1);
															
															if(!this.dontEncodePwd)  
															{
																fields.get(2).setValue(hex_sha1(hex_sha1(senha.getValue()) + this.hash));
															}
															else
															{
																this.dontEncodePwd = false;
																fields.get(2).setValue(hex_sha1(senha.getValue() + this.hash));
															}
															
															fields.get(3).setValue(tries + 1);
															
															senha.setDisabled(true);
														}
													}
													else 
													{
														Ext.MessageBox.alert('Erro', 'Por favor preencha os campos indicados.');
														return false;
													}
												}
											}
									}
						    })
					],
				listeners:
					{
						'render': function(_self)
							{
								this.setPosition(0,0);
								this.items.get(0)._parent = this;
								
								Ext.air.SystemTray.setIcon('lib/img/icons/AIRApp_32.png');
								air.NativeApplication.nativeApplication.icon.addEventListener('click', function()
									{
										Ext.air.SystemTray.hideIcon();
										window.nativeWindow.visible = true;
										_self.restore();
									});
							},
						'minimize': function()
							{
								window.nativeWindow.visible = false;
								Ext.air.SystemTray.showIcon();
							},
						'beforeclose': 
							{
								fn: function(_self)
									{
										Ext.MessageBox.wait('Finalizando a aplicação ...', 'Aguarde');
										
										Ext.Ajax.request(
											{
												url: '',
												callback: function()
												{
													_self.close();
												}
											});
										return false;
									},
								single: true
							}
					}
			});
		application.show();
	});
